# -*- coding:utf-8 -*-
# 服务进程在windows系统和Linux系统上有所不同
# 创建一个分布式进程:包括服务进程和任务进程
# 多个进程之间的通信使用Queue
# 该代码为服务进程
# 注意，运行时先运行服务进程，再运行任务进程
# 任务执行循序:
# 服务进程和任务进行都创建了相同的两个队列，一个用来放任务，一个用来放结果
# 第一步:服务进程运行，比如将数字2放进任务队列，任务进程从任务队列中取出数字2
# 第二步:取出数字，执行任务，就是2*2=4, 任务执行完后，放进结果队列
# 第三步:服务进程从结果队列中，取出结果。
# 第四步:所有任务执行完毕，所有结果都已经取出，最终任务队列和结果队列都是空的了
import queue
from multiprocessing.managers import BaseManager
class QueueManager(BaseManager):
    pass
        
db_send_web = queue.Queue() 
class queue_db_send_web:
    def return_db_send_web(self):
        global db_send_web # 定义成全局变量
        return db_send_web # 返回发送任务的队列
    def __init__(self,is_client=True):
        # 第二步:把上面创建的两个队列注册在网络上，利用register方法
        # callable参数关联了Queue对象，将Queue对象在网络中暴露
        # 第一个参数是注册在网络上队列的名称
        QueueManager.register('db_send_web', callable=self.return_db_send_web)
        # 第三步:绑定端口8001，设置验证口令,这个相当于对象的初始化
        # 绑定端口并填写验证口令，windows下需要填写IP地址，Linux下默认为本地，地址为空
        self.manager = QueueManager(address=('127.0.0.1',9991), authkey=b'erfsad') # 口令必须写成类似b'dihuge'形式，只写'dihuge'运行错误
    def start(self):
        self.manager.start()
        self.task = self.manager.db_send_web()
        return self.task
